#pragma once

#include "noncopyable.h"
#include "Thread.h"

#include <functional>
#include <mutex>
#include <condition_variable>
#include <string>

class EventLoop;

// EventLoopThread 类，用于管理一个 EventLoop 对象在单独的线程中的生命周期
class EventLoopThread : noncopyable
{
public:
    // ThreadInitCallback 的主要作用是在 EventLoop 开始运行之前，允许你对 EventLoop 对象进行一些特定的初始化操作。
    /**
     * void myInitCallback(EventLoop* loop) {
     * // 在这里可以对 EventLoop 做一些初始化操作，比如注册一些初始的 Channel。
     * }
     * EventLoopThread thread(myInitCallback, "MyEventLoopThread");
     */
    using ThreadInitCallback = std::function<void(EventLoop*)>; 

    EventLoopThread(const ThreadInitCallback &cb = ThreadInitCallback(), 
        const std::string &name = std::string());
    ~EventLoopThread();

    EventLoop* startLoop();  // 启动线程并返回关联 EventLoop 对象
private:
    void threadFunc();  // 线程中执行的函数

    EventLoop *loop_;  // 指向管理的 EventLoop 对象
    bool exiting_;  // 控制线程退出的状态
    Thread thread_; // 封装的线程对象
    std::mutex mutex_;  // 互斥量, 用于保存对 loop_ 的访问
    std::condition_variable cond_; // 条件变量, 用于线程同步
    ThreadInitCallback callback_; // 线程初始化时的回调函数
};